import requests
import time
import random
import os
import sys
import json
import asyncio
# import traceback

# dev:bili甜橙子的橙子

# 版本号
version = '1.1.0'
# 弹幕信息，如需修改请按照python列表格式修改
lis_text = ['走过路过不要错过，豆芽精品弹幕小游戏', '新人看左边说明加入游戏哦', '输入红，蓝，绿，黄加入阵营',
            '没金币了？输入低保领取50金币', '拒绝资本压制，打资本，分大钱！', '进入两色对峙前，投入金币最多者为领主',
            '越早加入阵营，胜利分成越多哦', '豆芽出品老牌弹幕游戏，玩了都说太好玩了', '你投入的金币会被用来科研升级速度/数量',
            '什么？都3202年了还没玩过豆芽的游戏', '豆芽>资本>低保>平民', '欢迎新人加群交流！群号在底下',
            '刺客是指与基地领土脱离连接的小球', '梭哈是指一次性投入全部金币(慎做)']

# 以下内容不要乱改，小心崩溃！
# 以下内容不要乱改，小心崩溃！
# 以下内容不要乱改，小心崩溃！

# 以下全局变量自动从配置获取

# 实时获取弹幕
is_get_danmu = True
# 房间号
roomid = '24604806'
# 时间间隔
timed = 30
# cookie
cookie = ''
# csrf
csrf = ''
# 弹幕列表
g_msg_list = []


# 配置文件读写
def read_config():
    try:
        os.makedirs('./autodanmu/images/', exist_ok=True)
        os.makedirs('./autodanmu/data/', exist_ok=True)
        file_dir = r'./autodanmu/config.json'
        config_v = {
            'c_is_get_danmu': True,
            'the_roomid': '25402044',
            'the_timed': 30,
            'your_csrf': 'press your csrf',
            'your_cookie': 'press your cookie',
        }
        try:
            with open(file_dir) as config_file:
                config = json.load(config_file)
                config_d = json.dumps(config, sort_keys=True, indent=4, separators=(',', ': '))
                # 声明作用域
                global cookie
                global csrf
                global roomid
                global timed
                global is_get_danmu
                cookie = config['your_cookie']
                csrf = config['your_csrf']
                roomid = config['the_roomid']
                timed = config['the_timed']
                is_get_danmu = config['c_is_get_danmu']
                print('=======================')
                print('[配置文件信息]')
                print('以下配置可到同文件夹目录autodanmu中config.json修改')
                print('或者你删掉这个文件夹再打开程序也行')
                print(config_d)
                print('配置文件读取成功!程序开始运行!')
                print('=======================')

        except FileNotFoundError:
            print('首先，请完善一些基本信息')
            print('=======================')
            print('PS:以下操作建议使用最新Chrome或Edge浏览器完成，如果还不会，请寻求帮助')
            print('1.请打开任意一个B站直播间，右键网页选择检查(或直接按下F12)')
            print('2.此时右侧会出现调试器，在调试器顶部点击网络(Network)')
            print('3.这个时候就开始抓取了，此时随便发送一条弹幕')
            print('4.下方的空档处会出现很多项目，找到一个叫send的，点击它')
            print('5.选择标头(Headers)往下翻，找到第一个数据cookie，右侧的数据复制下来')
            print('6.选择负载(Payload)往下翻，找到第二个数据csrf，右侧的数据复制下来')
            print('7.接下来请分别填写他们吧！')
            print('=======================')
            config_v['your_cookie'] = str(input('请把cookie粘贴在这里，然后回车:'))
            config_v['your_csrf'] = str(input('请把csrf粘贴在这里，然后回车:'))
            config_v['the_roomid'] = str(input('请把发送的房间号粘贴在这里，然后回车(豆芽的小房间:24604806):'))
            config_v['the_timed'] = int(input('弹幕几秒发送一次(推荐30):'))
            config_v['c_is_get_danmu'] = bool(input('是否实时显示直播间弹幕(填True或False):'))
            with open(file_dir, 'w+') as config_file:
                # config_w = json.dumps(config_v, sort_keys=True, indent=4, separators=(',', ': '))
                json.dump(config_v, config_file)
            with open(file_dir) as config_file_r:
                config = json.load(config_file_r)
                config_d = json.dumps(config, sort_keys=True, indent=4, separators=(',', ': '))
                print(config_d)
            os.system('cls')
            print('=======================')
            print('配置文件创建成功，请重启程序！')
            print('=======================')
            input('按回车退出程序...')
            sys.exit('CONFIG_CREATED_SUCCESSFULLY')
        return config_d
    except Exception as e:
        os.system('cls')
        print('=======================')
        print('配置文件创建或读写错误')
        print('你可能修改json时损坏了配置文件，请直接删除整个配置文件夹autodanmu')
        print('请检查程序目录下是否创建autodanmu文件夹，如果不，请尝试以管理员身份运行或不要把程序放在桌面或C盘根目录')
        print('如果依然无法解决问题，请提交issue或寻求帮助')
        print('错误代码:{}'.format(e))
        # traceback.print_exc()
        print('=======================')
        input('按回车退出程序...')
        sys.exit('FAILED_TO_LOAD_CONFIG')


# 获取弹幕
async def get_danmu():
    while True:
        # time.sleep(1.0)
        url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid=' + roomid
        response = requests.request('GET', url)
        response_json = json.loads(response.text)
        msg_list = []
        for msg in response_json['data']['room']:
            nickname = msg['nickname']
            timeline = msg['timeline']
            text = msg['text']
            uid = msg['uid']
            rnd = msg['rnd']
            if rnd in g_msg_list:
                pass
            else:
                msg_list.append(text)
                g_msg_list.append(rnd)
                print("[{}][{}({})]{}".format(timeline, nickname, uid, text))
        # return msg_list
        await asyncio.sleep(1)


# 发送弹幕
async def send():
    a = 0
    while True:
        # time.sleep(float(timed))
        send_meg = random.choice(lis_text)
        ti = int(time.time())
        url = 'https://api.live.bilibili.com/msg/send'
        data = {
            'color': '16777215',
            'fontsize': '25',
            'mode': '1',
            'msg': send_meg,
            'rnd': str(ti),
            'roomid': roomid,
            'bubble': '0',
            'csrf': csrf,
            'csrf_token': csrf
        }

        headers = {
            'cookie': cookie,
            'origin': 'https://live.bilibili.com',
            'referer': 'https://live.bilibili.com/blanc/1029?liteVersion=true',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/81.0.4044.138 Safari/537.36',
        }
        a += 1
        response = requests.post(url=url, data=data, headers=headers)
        response_json = response.json()
        if response_json['code'] == 0:
            success = '成功(0)'
        else:
            success = '失败({})({})'.format(response_json['code'], response_json['message'])

        if a == 1:
            print('=======================')
            print('[API响应信息]')
            print('HTTPS响应信息(200为成功):{}'.format(response))
            print('B站API响应信息(0为成功):{}'.format(success))
            print('如果失败了，请按照提示检查配置或检查浏览器上账号登录没')
            print('如需要停止发送，请直接关掉窗口')
            print('=======================')
        print('[{}]第{}条弹幕发送:{}'.format(success, a, send_meg))
        await asyncio.sleep(timed)


# 异步运行
async def main():
    if is_get_danmu:
        task1 = asyncio.create_task(get_danmu())
        task2 = asyncio.create_task(send())
        await asyncio.gather(task1, task2)
    else:
        task2 = asyncio.create_task(send())
        await asyncio.gather(task2)

print('欢迎使用自动弹幕机!-->dev:甜橙子的橙子-->ver=' + version)
read_config()
if __name__ == "__main__":
    asyncio.run(main())